
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>用了索引还是很慢，可能是什么原因？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>用了索引还是很慢，可能是什么原因？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在设计数据库索引时，什么是“覆盖索引”（Covering Index），它能解决什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">覆盖索引是指一个包含了查询所需所有列的索引。它能解决“索引覆盖不足”的问题，即当查询所需的列不在索引中时，数据库可能需要进行额外的查找操作（如回表）或放弃使用索引而进行全表扫描。使用覆盖索引可以避免对数据行的额外查找，从而提高查询性能。</div>
          </div>
          <div class="card-source">来源: 不合适的索引设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">索引列的“选择性”（Selectivity）指的是什么？为什么高选择性的列更适合做索引？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">索引列的“选择性”是指列中不同值的数量占总行数的比例。高选择性的列更适合做索引，因为这意味着列中包含的重复值较少，使得查询时数据库能够更高效地定位数据，需要扫描的索引页也更少，从而提高索引效率。</div>
          </div>
          <div class="card-source">来源: 不合适的索引设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">数据分布不均匀可能如何导致索引失效？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据分布不均匀可能导致索引失效主要有两个原因：1) 如果索引列的值集中在少数几个范围内，而查询条件涉及到其他范围的值，数据库可能会选择进行全表扫描。2) 如果索引列的部分值出现频率过高，会导致索引选择性降低，数据库可能因此选择不到合适的索引而进行全表扫描。</div>
          </div>
          <div class="card-source">来源: 数据分布不均匀</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中提到了频繁更新索引会导致的三个主要性能问题是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">频繁更新索引会导致的三个主要性能问题是：1) 索引重建开销：频繁的重建过程会消耗大量系统资源。2) 索引碎片化：增加索引的存储空间和访问成本，导致更多IO操作。3) 锁竞争：在并发环境下，索引更新可能导致锁等待，阻塞其他查询。</div>
          </div>
          <div class="card-source">来源: 频繁的索引更新</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当查询涉及过多JOIN操作时，为什么数据库的查询优化器会面临困难？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当存在多个连接条件和连接表时，数据库查询优化器在选择合适的索引和生成有效的查询计划方面会变得困难。这可能导致数据库无法选择到最佳索引或生成最优的执行计划，从而影响整体查询性能。</div>
          </div>
          <div class="card-source">来源: 过多的JOIN操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么即使有索引，当查询涉及大量数据时，数据库有时仍会选择进行全表扫描？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当查询涉及的数据量非常大时，即使存在索引，数据库优化器也可能判断全表扫描是更快的选项。此外，处理大量数据本身就会带来性能瓶颈，如巨大的磁盘IO开销、网络传输延迟和高内存消耗，这些都可能导致查询变慢。</div>
          </div>
          <div class="card-source">来源: 查询涉及大量数据</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">数据库的缓冲池（Buffer Pool）不足会如何直接影响查询性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当缓冲池的内存不足以容纳所有需要访问的数据页时，数据库会频繁地进行磁盘IO操作来读取数据，而磁盘IO通常是查询中的主要瓶颈。这会导致查询缓存命中率下降，并可能引发数据页的频繁刷新，从而严重影响查询性能。</div>
          </div>
          <div class="card-source">来源: 缓冲池和内存不足</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在创建联合索引（Composite Index）时，为什么索引列的顺序至关重要？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于联合索引，索引列的顺序非常重要，因为它需要与查询条件的顺序和模式相匹配。如果查询的条件与索引列的顺序不匹配，可能会导致索引失效或者数据库选择不到这个合适的索引，进而降低查询性能。因此，应根据查询的频率和选择性来合理安排列的顺序。</div>
          </div>
          <div class="card-source">来源: 不合适的索引设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">问题与解决</div>
          <div class="card-question">当查询语句中的数据类型与索引列的数据类型不匹配时，会产生什么后果？应如何解决？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">问题与解决</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果查询条件的数据类型与索引列的数据类型不匹配（例如，对字符串类型的索引列使用函数或类型转换），可能会导致索引失效，数据库转而执行全表扫描，从而降低查询性能。解决方案是确保查询条件和索引列的数据类型严格匹配，避免不必要的数据类型转换。</div>
          </div>
          <div class="card-source">来源: 不合适的索引设计</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
